/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Dato.DAO;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import transervfx.Dato.Entidad.Cliente;
import transervfx.Dato.Entidad.Encomienda;
import transervfx.Dato.Entidad.Lugar;

/**
 *
 * @author oscar
 */
public class EncomiendaDAO implements Dao<Encomienda, Long> {

    private static EncomiendaDAO INSTANCE = null;

    /**
     * Crea el Gestor Auxiliar
     */
    protected EncomiendaDAO() {
    }

    /**
     * creador sincronizado para protegerse de posibles problemas multi-hilo
     * otra prueba para evitar instanciación múltiple
     */
    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new EncomiendaDAO();
        }
    }

    /**
     * Obtiene la instancia.
     *
     * @return devuelve la instancia del "GestorAuxiliar".
     */
    public static EncomiendaDAO getInstance() {
        if (INSTANCE == null) {
            createInstance();
        }
        return INSTANCE;
    }
    
    
    
    
    public Encomienda findById(String id) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.find(Encomienda.class, id);

        } finally {
            em.close();
        }
    }

    @Override
    public void persist(Encomienda encomienda) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            EntityTransaction t = em.getTransaction();
            try {
                t.begin();
                if(encomienda.getOrigen().getId()!=null)
                {               
                    encomienda.setOrigen(em.find(Lugar.class,encomienda.getOrigen().getId()));
                }
                if(encomienda.getDestino().getId()!=null){                        
                       encomienda.setDestino(em.find(Lugar.class,encomienda.getDestino().getId()));
                }
                if(encomienda.getCobroRevertido()){
                  
                    encomienda.setDeuda(em.find(Cliente.class,encomienda.getReceptor().getId()).getDeuda());
                }else{
                    System.out.println(em.find(Cliente.class,encomienda.getEmisor().getId()).getDeuda());
                
                    encomienda.setDeuda(em.find(Cliente.class,encomienda.getEmisor().getId()).getDeuda());
                }
                
                em.persist(encomienda);
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    //donde puedo meter una ventana de exito?
    //en el crear repartidor cuando acepta
    //ahi te lo busco
    @Override
    public void remove(Encomienda entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            EntityTransaction t = em.getTransaction();
            try {
                t.begin();
                System.out.println("ESTAS POR ELIMIAR");
                entity = em.getReference(Encomienda.class, entity.getId());
                em.remove(entity);
                System.out.println("LO ELIMINA");
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    @Override
    public void update(Encomienda entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {


            em.getTransaction().begin();
            System.out.println("Entra a modificar la encomienda");
            em.merge(entity);

            em.getTransaction().commit();
            System.out.println("Modifica la encomienda");

        } finally {
            em.close();
        }
    }

    

    @Override
    public List<Encomienda> findAll() {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.createNamedQuery("Encomienda.findAll").getResultList();

        } finally {
            em.close();
        }
    }

    public Encomienda findByCompleto(Encomienda encomiendaSeleccionada) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

           //poner find no reference
            encomiendaSeleccionada = em.find(Encomienda.class, encomiendaSeleccionada.getId());

            
            return encomiendaSeleccionada;

        } finally {
            em.close();
        }
    }

    @Override
    public Encomienda findById(Long id) {
        throw new UnsupportedOperationException("NO ESTA SOPORTADA ESTA OPERACION...");
    }

   
}
